package com.ylr.base.common.dto;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-05-07 23:03:00
 * className: PageDto 分页数据封装工具类
 * version: 1.0
 * description:
 */
@Getter
@Setter
@ToString
public class PageDto<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 总记录数
     */
    private Long totalNum;

    /**
     * 总页码数
     */
    private Integer totalPage;

    /**
     * 当前页码数
     */
    private Integer pageNo;

    /**
     * 当前页显示个数
     */
    private Integer pageSize;

    /**
     * 数据集合
     */
    private List<T> list;

    /**
     * 是否可以上一页
     */
    private Boolean hasPrevious;

    /**
     * 是否可以下一页
     */
    private Boolean hasNext;

    public PageDto() {
        this.totalNum = 0L;
        this.totalPage = 0;
        this.pageNo = 0;
        this.pageSize = 0;
        this.list = Collections.emptyList();
        this.hasPrevious = Boolean.FALSE;
        this.hasNext = Boolean.FALSE;
    }

    /**
     * 手动构造分页对象
     * @param list       数据集合
     * @param totalNum   数据总数
     * @param pageNo  当前页码
     * @param pageSize      当前页显示个数
     */
    public PageDto(List<T> list, long totalNum, int pageNo, int pageSize) {
        this.totalNum = totalNum;
        this.totalPage = (int) Math.ceil((double) totalNum / pageSize);
        this.pageNo = pageNo;
        this.pageSize = pageSize;
        this.list = list;
        this.hasPrevious = pageNo > 1;
        this.hasNext = pageNo < totalPage;
    }

//    /**
//     * 根据mp分页对象，构造自己的分页对象
//     * @param page MybatisPlus分页对象
//     */
//    public PageDto(IPage<T> page) {
//        this.list = page.getRecords();
//        this.totalNum = page.getTotal();
//        this.totalPage = Math.toIntExact(page.getPages());
//        this.pageNo = Math.toIntExact(page.getCurrent());
//        this.pageSize = Math.toIntExact(page.getSize());
//        this.hasPrevious = page.getCurrent() > 1;
//        this.hasNext = page.getCurrent() < page.getPages();
//    }

    /**
     * 根据data列表和分页参数，对列表进行分页操作，并将结果封装到PageDto中
     * @param list      数据列表
     * @param pageIndex 当前页码
     * @param limit     当前也显示个数
     * @return 封装完成的PageDto对象
     */
    public static <T> PageDto<T> pageDtoBuild(List<T> list, int pageIndex, int limit) {
        PageDto<T> page = new PageDto<>();
        page.setTotalNum((long) list.size());
        page.setTotalPage((int) Math.ceil((double) list.size() / limit));
        page.setPageNo(pageIndex);
        page.setPageSize(limit);
        page.setHasPrevious(page.getPageNo() > 1);
        page.setHasNext(page.getPageNo() < page.getTotalPage());

        // 分页开始下标
        int start = (pageIndex - 1) * limit;
        if (list.size() > start) {
            // 分页结束下标
            int end = start + limit;
            // 获取结束下标
            end = Math.min(end, list.size());
            // 数据截取
            list = new ArrayList<>(list.subList(start, end));
        } else {
            // 不可分页
            list = Collections.emptyList();
        }
        page.setList(list);

        return page;
    }

}
